package model;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.util.Log;

public class Todo implements Serializable {

	private static final long serialVersionUID = 1L;
	//	保存用項目
	private long 	id;
	private String 	action;
	private long 	time;	//	日時
	private int  	done;	//	状態
	//	表示用項目
	private int year;		//	年
	private int month;		//	月
	private int day;		//	日
	private int hour;		//	時
	private int minute;		//	分
	/**
	 * コンストラクタ
	 */
	public Todo() {
	}
	/**
	 * 日時と表示用項目を設定するコンストラクタ
	 * @param date	日時
	 */
	public Todo(Date date) {
		this.time = date.getTime();
		timeToCalendar();
	}
	//	保存用項目のgetter
	public long getId() {
		return id;
	}
	public String getAction() {
		return action;
	}
	public long getTime() {
		return time;
	}
	/**
	 * 状態を取得する
	 * @return	完了している場合true、完了していない場合false
	 */
	public boolean getDone() {
		return (done==1 ? true : false);
	}
	public void setId(long id) {
		this.id = id;
	}
	//	保存用項目のsetter
	public void setAction(String action) {
		this.action = action;
	}
	public void setTime(long time) {
		this.time = time;	//	値を保存する
		timeToCalendar();	//	
	}
	public void setTime() {
		calendarToTime();
	}
	public void setDone(boolean done) {
		this.done = done ? 1 : 0;
	}
	public void setDone(int done) {
		this.done = done;
	}
	//	表示用項目のgetter
	public int getYear() {
		return year;
	}
	public int getMonth() {
		return month;
	}
	public int getDay() {
		return day;
	}
	public int getHour() {
		return hour;
	}
	public int getMinute() {
		return minute;
	}
	//	表示用項目のsetter
	public void setYear(int year) {
		this.year = year;
	}
	public void setMonth(int month) {
		this.month = month;
	}
	public void setDay(int day) {
		this.day = day;
	}
	public void setHour(int hour) {
		this.hour = hour;
	}
	public void setMinute(int minute) {
		this.minute = minute;
	}
	/**
	 * オブジェクトの内容をContentValuesの型に変換する
	 * @return	ContentValuesオブジェクト
	 */
	public ContentValues toContentValues() {
		ContentValues cv = new ContentValues();
		cv.put("action", this.action);
		cv.put("time", this.time);
		cv.put("done", this.done);
		return cv;
	}
	/**
	 * 設定されている日時から表示用項目を設定する
	 */
	private void timeToCalendar() {
		Log.d("Todo.timeToCalendar start", this.toString());
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date(this.time));
		
		this.year 	= cal.get(Calendar.YEAR);
		this.month 	= cal.get(Calendar.MONTH);
		this.day 	= cal.get(Calendar.DAY_OF_MONTH);
		this.hour 	= cal.get(Calendar.HOUR_OF_DAY);
		this.minute = cal.get(Calendar.MINUTE);

		Log.d("Todo.timeToCalendar end  ", this.toString());
	}
	/**
	 * 設定されている表示用項目から日時を設定する
	 */
	private void calendarToTime() {
		Log.d("Todo.calendarToTime start", this.toString());
		
		Calendar cal = Calendar.getInstance();

		cal.set(Calendar.YEAR, this.year);
		cal.set(Calendar.MONTH, this.month);
		cal.set(Calendar.DAY_OF_MONTH, this.day);
		cal.set(Calendar.HOUR_OF_DAY, this.hour);
		cal.set(Calendar.MINUTE, this.minute);
		
		this.time = cal.getTimeInMillis();

		Log.d("Todo.calendarToTime end  ", this.toString());
	}
	/**
	 * デバッグ用に情報を編集して返す
	 */
	@SuppressLint("DefaultLocale") 
	public String toString() {
		return String.format(
				"<id>%d <action>%s <time>%s %d-%d-%d %d:%d <done>%d", 
				this.id,
				this.action,
				new Date(this.time).toString(),
				this.year,
				this.month,
				this.day,
				this.hour,
				this.minute,
				this.done);
	}
}
